#include <iostream>

using namespace std;

#define MAX_N 1000000
char s[MAX_N + 5];
int nxt[MAX_N + 5];

// 构建kmp的next数组
void get_next(char *s, int *next){
    int j = -1;
    nxt[0] = -1;
    for(int i = 1; s[i]; ++i){
        while(j != -1 && s[i] != s[j + 1]) j = nxt[j];
        if(s[i] == s[j + 1]) j+=1;
        nxt[i] = j;
    }
    return;
}

// 对于每个位置i，计算当前子串的长度length = i + 1。
// 根据next数组，计算可能的前缀长度d = length - next[i] - 1
// 检查d是否为length的因数，即length % d == 0
// 如果满足条件且重复次数n = length / d大于等于2，则输出当前位置和n
int main(){
    int len;
    scanf("%d", &len);
    scanf("%s", s);
    get_next(s, nxt);
    int currentlen = 0;
    int prefixlen = 0;
    for(int i = 1; i < len; ++i){
        currentlen = i + 1;
        prefixlen = currentlen - nxt[i] - 1;
        if(prefixlen > 0 && currentlen % prefixlen == 0 && currentlen / prefixlen >= 2){
            printf("%d %d\n", currentlen, currentlen / prefixlen);
        }
    }

    return 0;
}